iT邦幫忙

2026 iThome 鐵人賽

DAY 23
0
Kubernetes

從零開始的雲端實戰:30 天 Kubernetes 核心觀念與部署指南系列 第 25

【Day 25】集中式日誌管理:使用 Grafana Loki + Promtail 收集 Pod 日誌

  • 分享至 

  • xImage
  •  

今日目標

  • 理解傳統使用 kubectl logs 排查問題在微服務架構下的瓶頸。
  • 搞懂 Kubernetes 集中式日誌架構:Loki(日誌儲存)Promtail(日誌收集代理)
  • 掌握 Loki「只對標籤(Labels)建索引」的輕量化核心優勢(對比傳統 ELK 架構)。
  • 實戰操作:使用 Helm 部署 Loki 與 Promtail,並在 Grafana 中透過 LogQL 即時過濾搜尋 Pod 日誌。

痛點場景:為什麼單靠 kubectl logs 不夠用?

在前面的實作中,我們習慣用 kubectl logs <pod-name> 來查看容器日誌。但當系統進入生產環境時,會面臨三大致命瓶頸:

痛點 說明
1. 容器重啟後日誌遺失 當 Pod 發生 Crash 或重啟時,舊容器的歷史日誌隨之消失,難以追蹤事發原因。
2. 多副本難以聚合查詢 當 Deployment 開了 10 個 Pod,你無法預測報錯出現在哪一個 Pod 上,逐一手動查看極無效率。
3. 跨微服務追蹤困難 一個電商結帳請求涉及會員、訂單、金流等多個 Pod,無法在單一介面進行時間軸關聯搜尋。

因此,建立一套**「集中式日誌收集與搜尋系統」**是上線後的必備基石。


輕量級日誌架構:Grafana Loki vs. ELK

過去業界最常使用的日誌方案是 ELK(Elasticsearch + Logstash + Kibana),但 Elasticsearch 會為整段日誌全文建立倒排索引(Inverted Index),非常消耗 CPU 與記憶體(往往佔用數十 GB RAM)。

Grafana Labs 推出的 Loki 被譽為「日誌界的 Prometheus」:

  • 核心哲學只對日誌的元資料標籤(如 app=nginx, namespace=default)建立索引,日誌內容本身則進行壓縮存入物件儲存或硬碟。
  • 超輕量高效:相比 ELK,Loki 佔用的記憶體與硬碟空間極小,非常適合雲原生與中小規模集群。
  • 生態系無縫整合:與我們在 Day 24 部署的 Grafana 完美融合,同一個介面既能看指標(Metrics)也能看日誌(Logs)。

日誌收集傳輸流程

元件 角色定位 運作機制
Promtail 採集代理(Agent) 以 DaemonSet 方式在每個節點運行,自動抓取該節點上所有容器產生的日誌並打上標籤。
Loki 儲存中樞(Server) 接收 Promtail 傳來的日誌,建立標籤索引並持久化儲存。
Grafana 查詢介面(UI) 使用 LogQL 語法向 Loki 發送查詢請求,並在網頁上視覺化呈現。

實戰演練:部署 Loki 與 Promtail

我們使用 Grafana 官方 Helm Repo 快速完成安裝。

步驟 1:新增 Grafana Helm Repo

helm repo add grafana [https://grafana.github.io/helm-charts](https://grafana.github.io/helm-charts)
helm repo update

步驟 2:使用 Helm 安裝 Loki 與 Promtail

將 Loki 與 Promtail 安裝至 Day 24 建立的 monitoring 命名空間中:

helm install loki-stack grafana/loki-stack \
  --namespace monitoring \
  --set promtail.enabled=true \
  --set loki.persistence.enabled=false

檢查 Promtail 與 Loki Pod 是否已正常啟動:

kubectl get pods -n monitoring -l "app in (loki, promtail)"

步驟 3:在 Grafana 中新增 Loki 資料來源

使用端口轉發開啟 Grafana(沿用 Day 24 的服務):

kubectl port-forward --namespace monitoring svc/prometheus-stack-grafana 3000:80

打開瀏覽器進入 http://localhost:3000

  1. 點選左側選單的 AdministrationData sources
  2. 點擊 Add data source,選擇 Loki
  3. Loki server URL 輸入內部 Service 網址:
[http://loki-stack.monitoring.svc.cluster.local:3100](http://loki-stack.monitoring.svc.cluster.local:3100)
  1. 滑到最下方點擊 Save & test,確認出現綠色成功訊息。

步驟 4:使用 LogQL 搜尋日誌實戰

點選 Grafana 左側選單的 Explore(指南針圖示),右上角資料來源選擇 Loki

在搜尋框中輸入 LogQL 查詢語法:

查詢 default 命名空間下所有應用的即時日誌:

{namespace="default"}

精準過濾特定 App 的日誌,並搜尋含有 "error" 關鍵字的紀錄:

{app="nginx-app"} |= "error"

排除健康檢查探針產生的無效日誌(例如排除含有 "kube-probe" 的行):

{app="nginx-app"} != "kube-probe"

點擊右上角的 Run query,下方就會即時列出所有符合條件的日誌串流,並支援點擊展開查看單一 Log 的完整詳細資訊!


本日小結

今天我們成功搞懂並搭建了雲原生主流的日誌解決方案:

  • 理解了 Loki(標籤索引、輕量儲存)Promtail(日誌採集) 的架構。
  • 在 Grafana 中打通了從指標(Metrics)到日誌(Logs)的雙重視覺化路徑。
  • 掌握了基本 LogQL 語法進行高效日誌過濾與錯誤定位。

現在我們擁有了自動擴縮(HPA)、指標監控(Prometheus/Grafana)與集中日誌(Loki)。但在企業維運中,若沒有嚴格的權限控管,任何人都可能不小心 kubectl delete pod 甚至刪除整個集群。

明天 Day 26,我們將進入企業資安核心:「集群安全守門員:RBAC 角色權限控管與 ServiceAccount」


上一篇
【Day 24】全方位可觀測性:Prometheus + Grafana 監控集群指標
下一篇
【Day 26】集群安全守門員:RBAC 角色權限控管與 ServiceAccount
系列文
從零開始的雲端實戰:30 天 Kubernetes 核心觀念與部署指南30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言